#include "annuaire.h"

using namespace std;
Annuaire::Annuaire() {
}

Annuaire* Annuaire::getInstance() {
	if (Annuaire::singleton == NULL) {
		Annuaire::singleton = new Annuaire();
	}
	return Annuaire::singleton;
}
//Initialisation du singleton
Annuaire* Annuaire::singleton= NULL;

Annuaire::~Annuaire() {
}

int Annuaire::getSize() {
	return this->listeClient.size();
}
/***********************************************************
 * 						Gestion Compte					   *
 **********************************************************/
Annuaire::client Annuaire::initStructClient() {
	struct client c;

	c.num=0;
	c.adresse="";
	c.consomme=0;
	c.estMobile=false;
	c.infoComptable="";
	c.messagerieActive=false;
	c.numTransfert=0;
	c.repondeurActif=false;
	c.transfertActif=false;
	c.typeAbonnement=0;
	c.estConnecte=0;

	return c;
}

vector< Annuaire::client> Annuaire::getClients() {
	return this->listeClient;
}

void Annuaire::ajouter(struct client _compteClient) {
	this->listeClient.push_back(_compteClient);
}

void Annuaire::supprimer(int _num) {
	bool trouve=false;
	vector<struct client>::iterator it;
	it=this->listeClient.begin();
	for (int i = 0; i<(int)this->listeClient.size() && !trouve; i++) {
		if (this->listeClient.at(i).num == _num) {
			this->listeClient.erase(it);
			trouve=true;
		}
		it++;
	}
}

void Annuaire::modifier(int _ancienNum, struct client _compteClient) {
	bool trouve=false;
	for (int i = 0; i<(int)this->listeClient.size() && !trouve; i++) {
		if (this->listeClient.at(i).num==_ancienNum) {
			this->listeClient.at(i)=_compteClient;
			trouve=true;
		}
	}
}

int Annuaire::rechercher(int _num) {
	bool trouve=false;
	int n;
	int index=0;
	int indextrouve=0;
	for (index = 0; index<(int)this->listeClient.size() && !trouve; index++) {
		if (this->listeClient.at(index).num==_num) {
			trouve=true;
			indextrouve=index;
		}
	}
	if (!trouve) {
		n=-1;
	} else {
		if (this->listeClient.at(indextrouve).transfertActif) {
			n=this->listeClient.at(indextrouve).numTransfert;
		} else {
			n=_num;
		}
	}
	return n;
}

Annuaire::client Annuaire::recupererCompteClient(int _num) {
	struct client c;
	bool trouve=false;
	int index=0;

	c=this->initStructClient();
	for (index = 0; index<(int)this->listeClient.size() && !trouve; index++) {
		if (this->listeClient.at(index).num==_num) {
			c=this->listeClient.at(index);
			trouve=true;
		}
	}
	return c;
}

int Annuaire::getEstConnecte(int _num) {
	bool trouve=false;
	int index=0;
	int connecte=0;
	int indextrouve=0;

	for (index = 0; index<(int)this->listeClient.size() && !trouve; index++) {
		if (this->listeClient.at(index).num==_num) {
			trouve=true;
			indextrouve=index;
		}
	}
	if (!trouve) {
		connecte=-1;
	} else {
		if (this->listeClient.at(indextrouve).estConnecte) {
			connecte=1;
		} else {
			connecte=0;
		}
	}
	return connecte;
}

/***********************************************************
 * 						Gestion Historique				   *
 **********************************************************/

void Annuaire::ajouterLigneHistorique(struct ligneHistorique _lh) {
	this->historique.push_back(_lh);
}

void Annuaire::razHistorique() {
	this->historique.clear();
}

int Annuaire::montantFacture(int _num) {
	int res=0;
	int index=0;

	for (index=0; index<(int)this->historique.size(); index++) {
		if (this->historique.at(index).appelant == _num) {
			res=res+this->historique.at(index).duree;
		}
	}

	return res;
}

vector<Annuaire::ligneHistorique> Annuaire::factureDetaillee(int _num) {
	vector<struct ligneHistorique> tempLigneHisto;
	int index=0;

	for (index=0; index<(int)this->historique.size(); index++) {
		if (this->historique.at(index).appelant == _num) {
			tempLigneHisto.push_back(this->historique.at(index));
		}
	}

	return tempLigneHisto;
}

